Can check to see if specified default factory or value is present, can check to see if class is instanciable with no arguments If not then can try and find the type of those arguments in the signature and use that to find default values for those types and use those instances to instanciate the desired type.

Complex types

What about complex types found in the typing module, the above method could generate an instance of tuple-> () but it couldnt generate an instance of tuple[ str]-> ( "")

list is easy as its arguments dont indicate a prescence

dict is the same

NewType( "A", str) should have the same default instance as str

Union[ g, h, j] can just have the default instance of the element at index 0. this is g here

Any can have a default instance of None

ForwardRef needs to have the same default instance of the thing that its refering to